package com.bicon.base.data.common;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Comparator;

/**
 * 该类是普通查询的工具类。
 * 
 * @author Administrator
 * 
 */
public class AnalysisUtil {

	// 表示需要精确到小数点以后几位
	public static final int scale = 4;

	/**
	 * 提供精确的加法运算。
	 * 
	 * @param v1
	 *            被加数
	 * @param v2
	 *            加数
	 * @return 两个参数的和
	 */
	public static double addDouble(double d1, double d2) {
		BigDecimal bd1 = new BigDecimal(Double.toString(d1));
		BigDecimal bd2 = new BigDecimal(Double.toString(d2));
		return bd1.add(bd2).doubleValue();
	}

	/**
	 * 提供精确的减法运算。
	 * 
	 * @param v1
	 *            被减数
	 * @param v2
	 *            减数
	 * @return 两个参数的差
	 */
	public static double subDouble(double d1, double d2) {
		BigDecimal bd1 = new BigDecimal(Double.toString(d1));
		BigDecimal bd2 = new BigDecimal(Double.toString(d2));
		return bd1.subtract(bd2).doubleValue();
	}

	/**
	 * 提供精确的乘法运算。
	 * 
	 * @param v1
	 *            被乘数
	 * @param v2
	 *            乘数
	 * @return 两个参数的积
	 */
	public static double mulDouble(double d1, double d2) {
		BigDecimal bd1 = new BigDecimal(Double.toString(d1));
		BigDecimal bd2 = new BigDecimal(Double.toString(d2));
		return bd1.multiply(bd2).doubleValue();
	}

	/**
	 * 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到 小数点以后10位，以后的数字四舍五入。
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @return 两个参数的商
	 */
	public static double divDouble(double d1, double d2) {
		return div(d1, d2, scale);
	}

	/**
	 * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指 定精度，以后的数字四舍五入。
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 提供精确的小数位四舍五入处理。
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException(
					"The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	public static boolean isNum(String str) {
		return str.matches("^[-+N]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
	}

	/**
	 * 对集合进行排序
	 */
	public static void sort() {
		Comparator<String> com = new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				String[] as = o1.split(" ");// 是按关键字+“ ”+count 如"15819428935 3"
											// 的形式来保存的，比较count的大小，来进行排序
				String[] bs = o2.split(" ");
				if (as.length != 2 || bs.length != 2)
					return 1;
				int a = Integer.parseInt(as[0]);
				int b = Integer.parseInt(bs[0]);
				return -a + b;
			}
		};

	}

	public static int getPage(int i) {
		if (i == 0)
			return i;
		int count = i / 50000 + i % 50000 == 0 ? 0 : 1;
		return count;
	}
	/**
	 * 解决Double显示科学计数法问题！比如10000000.21的Double类型 却显示成10.00000021E7
	 * 并保留两位小数
	 */
	public static String DecimalFormatDouble(double d) {
		DecimalFormat df  =new DecimalFormat("0.00");
		return df.format(d);
	}
	
}
